package services

import (
	"errors"
	"log"
	"qimo_work/models"
	"qimo_work/repositories"
	"qimo_work/utils"
	"strings"

	"golang.org/x/crypto/bcrypt"
	"gorm.io/gorm"
)

// 注册用户，包含用户名唯一性检查、密码加密、用户创建
// Register 用户注册
// Register 用户注册
func RegisterUser(user *models.User) error {
	// 检查用户名是否已存在
	existingUser, err := repositories.FindUserByUsername(user.Username)
	if err != nil && err != gorm.ErrRecordNotFound {
		log.Println("Database error: ", err)
		return errors.New("Database error")
	}
	if existingUser.ID != 0 {
		return errors.New("Username already taken")
	}

	// 检查邮箱是否已存在
	existingUser, err = repositories.FindUserByEmail(user.Email)
	if err != nil && err != gorm.ErrRecordNotFound {
		log.Println("Database error: ", err)
		return errors.New("Database error")
	}
	if existingUser.ID != 0 {
		return errors.New("Email already taken")
	}

	// 加密密码
	hashedPassword, err := utils.HashPassword(user.Password) // 使用明文密码进行加密
	if err != nil {
		return errors.New("Could not hash password")
	}

	user.PasswordHash = hashedPassword

	// 创建用户
	if err := repositories.CreateUser(user); err != nil {
		return errors.New("Could not create user")
	}

	return nil
}

// Login 用户登录
// Login 用户登录
func LoginUser(username, password string) (string, string, error) {
	// 查找用户
	user, err := repositories.FindUserByUsername(username)
	if err != nil {
		return "", "", errors.New("Invalid username or password")
	}

	// 去除密码中的空格
	password = strings.TrimSpace(password)

	// 比对密码
	err = bcrypt.CompareHashAndPassword([]byte(user.PasswordHash), []byte(password))
	if err != nil {
		return "", "", errors.New("Invalid username or password")
	}

	// 生成 JWT
	token, err := utils.GenerateJWT(user)
	if err != nil {
		return "", "", errors.New("Failed to generate JWT")
	}

	log.Println("Login successful")
	// 返回 JWT token 和用户角色
	return token, user.Role, nil
}
